package com.sz.biz.logistics.serialno.service;

import com.sz.biz.logistics.serialno.dto.SerialNoGenerateDto;
import com.sz.biz.logistics.serialno.dto.SerialNoImportFileResultDto;
import com.sz.biz.logistics.serialno.dto.SerialNoRuleDetailDto;
import com.sz.biz.logistics.serialno.dto.SerialNoRuleRangeDto;
import com.sz.biz.logistics.serialno.entity.SerialNoRule;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;

import java.io.InputStream;
import java.util.List;

/**
 * Function: 单号规则相关功能接口 <br>
 * Author: Johnboy <br>
 * Date: 2017-12-07 17:10:00
 */
public interface NoRuleService {
    
    /**
     * 保存单号规则
     * @param serialNoRule 单号规则
     * @return 保存成功的条目id
     */
    int save(SerialNoRule serialNoRule);
    
    /**
     * 保存单号规则详情
     * @param serialNoRuleDetailDto 单号规则详情
     * @param type 单号规则类型
     */
    void save(SerialNoRuleDetailDto serialNoRuleDetailDto, int type);
    
    /**
     * 更新单号规则详情
     * @param serialNoRuleDetailDto 单号规则详情
     * @param id 单号规则详情对应的数据库id
     */
    void update(SerialNoRuleDetailDto serialNoRuleDetailDto, int id );
    
    /**
     * 更新规则状态
     * @param id 单号规则对应的数据库id
     * @param status 待更新的状态
     */
    void updateRuleStatus(int id, int status);
    
    /**
     * 根据id查找单号规则
     * @param id 单号规则id
     * @return 对应的单号规则
     */
    SerialNoRule find(int id);
    
    /**
     * 单号规则条件查询
     * @param queryParams 查询条件集合
     * @param type 类型
     * @return 对应的单号规则封装
     */
    QResultDto findRules(QueryParams queryParams,int type);
    
    /**
     * 启用规则
     * @param id 规则id
     */
    void enableRules(int id);
    
    /**
     * 获取示例单号
     * @param id 规则id
     * @return 示例单号列表
     */
    List<String> getExampleChannelNos(int id);
    
    /**
     * 停用规则
     * @param id 规则id
     */
    void disableRules(int id);
    
    /**
     * 根据规则id查询规则详情
     * @param id 规则id
     * @return 对应的规则详情
     */
    SerialNoRuleDetailDto queryDetailsDtoById(int id);
    
    /**
     * 生成渠道单号
     * @param serialNoGenerateDto 生成的单号信息
     * @param type 单号类型
     * @return 生成单号数量
     */
    long generateChannelNo(SerialNoGenerateDto serialNoGenerateDto, int type);
    
    /**
     * 根据服务Uid查询单号规则
     * @param serviceUid 服务Uid
     * @return 单号规则列表
     */
    List<SerialNoRule> queryByServiceUid(String serviceUid);
    
    /**
     * 发送提醒消息
     * @param serialNoRuleDetailDto 单号详情
     * @param batchNumber 批次号
     */
    void sendMessage(SerialNoRuleDetailDto serialNoRuleDetailDto, String batchNumber);
    
    /**
     * 从文件流读取Excel内容
     * @param inputStream 输入流
     * @param serviceUid 服务Uid
     * @return 从文件导入的渠道单号结果
     */
    SerialNoImportFileResultDto readImportExcelFromStream(InputStream inputStream, String serviceUid);
    
    /**
     * 根据服务Uid查询规则支持的单号范围
     * @param serviceUid 服务Uid
     * @return 单号范围列表
     */
    List<SerialNoRuleRangeDto> searchRuleBoundariesByServiceUid(String serviceUid);
    
    /**
     * 根据产品组id及产品Uid查询单号规则
     * @param productGroupId 产品组id
     * @param productId 产品Uid
     * @return 规则列表
     */
    List<SerialNoRule> queryByProductGroupId(Integer productGroupId, String productId);
    
    /**
     * 服务条件查询
     * @param queryParams 查询条件集合
     * @return 符合条件的服务信息封装
     */
    QResultDto findService(QueryParams queryParams);
    
    /**
     * 根据类型查找所有规则的详情
     * @param type 类型
     * @return 规则详情列表
     */
    List<SerialNoRuleDetailDto> findAllRulesDetailByType(int type);
    
    /**
     * 产品条件查询
     * @param params 查询条件集合
     * @return 符合条件的产品信息封装
     */
    QResultDto findProductByQueryParams(QueryParams params);
}
